/*
 * 牛券（oneCoupon）优惠券平台项目
 *
 * 版权所有 (C) [2024-至今] [山东流年网络科技有限公司]
 *
 * 保留所有权利。
 *
 * 1. 定义和解释
 *    本文件（包括其任何修改、更新和衍生内容）是由[山东流年网络科技有限公司]及相关人员开发的。
 *    "软件"指的是与本文件相关的任何代码、脚本、文档和相关的资源。
 *
 * 2. 使用许可
 *    本软件的使用、分发和解释均受中华人民共和国法律的管辖。只有在遵守以下条件的前提下，才允许使用和分发本软件：
 *    a. 未经[山东流年网络科技有限公司]的明确书面许可，不得对本软件进行修改、复制、分发、出售或出租。
 *    b. 任何未授权的复制、分发或修改都将被视为侵犯[山东流年网络科技有限公司]的知识产权。
 *
 * 3. 免责声明
 *    本软件按"原样"提供，没有任何明示或暗示的保证，包括但不限于适销性、特定用途的适用性和非侵权性的保证。
 *    在任何情况下，[山东流年网络科技有限公司]均不对任何直接、间接、偶然、特殊、典型或间接的损害（包括但不限于采购替代商品或服务；使用、数据或利润损失）承担责任。
 *
 * 4. 侵权通知与处理
 *    a. 如果[山东流年网络科技有限公司]发现或收到第三方通知，表明存在可能侵犯其知识产权的行为，公司将采取必要的措施以保护其权利。
 *    b. 对于任何涉嫌侵犯知识产权的行为，[山东流年网络科技有限公司]可能要求侵权方立即停止侵权行为，并采取补救措施，包括但不限于删除侵权内容、停止侵权产品的分发等。
 *    c. 如果侵权行为持续存在或未能得到妥善解决，[山东流年网络科技有限公司]保留采取进一步法律行动的权利，包括但不限于发出警告信、提起民事诉讼或刑事诉讼。
 *
 * 5. 其他条款
 *    a. [山东流年网络科技有限公司]保留随时修改这些条款的权利。
 *    b. 如果您不同意这些条款，请勿使用本软件。
 *
 * 未经[山东流年网络科技有限公司]的明确书面许可，不得使用此文件的任何部分。
 *
 * 本软件受到[山东流年网络科技有限公司]及其许可人的版权保护。
 */

package com.xwj.coupon.admin.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xwj.coupon.admin.dto.req.CouponTemplateNumberReqDTO;
import com.xwj.coupon.admin.dto.req.CouponTemplatePageQueryReqDTO;
import com.xwj.coupon.admin.dto.req.CouponTemplateSaveReqDTO;
import com.xwj.coupon.admin.dto.resp.CouponTemplatePageQueryRespDTO;
import com.xwj.coupon.admin.dto.resp.CouponTemplateQueryRespDTO;
import com.xwj.coupon.admin.framework.exception.ServiceException;
import com.xwj.coupon.admin.repository.mysql.entity.CouponTemplateDO;
import com.xwj.coupon.admin.repository.mysql.mapper.CouponTemplateMapper;
import com.xwj.coupon.admin.service.CouponTemplateService;
import com.xwj.coupon.admin.service.event.coupontemplate.CouponTemplateEvent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;

import java.util.Optional;

/**
 * 优惠券模板业务逻辑实现层
 * <p>
 * 作者：马丁
 * 加项目群：早加入就是优势！500人内部项目群，分享的知识总有你需要的 <a href="https://t.zsxq.com/cw7b9" />
 * 开发时间：2024-07-08
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class CouponTemplateServiceImpl extends ServiceImpl<CouponTemplateMapper, CouponTemplateDO> implements CouponTemplateService {

    private final CouponTemplateMapper couponTemplateMapper;

    private final ApplicationEventPublisher applicationEventPublisher;

    @Override
    public void createCouponTemplate(CouponTemplateSaveReqDTO requestParam) {
        //1.责任链模式校验参数
        //2.分布式锁防止重复创建（controller注解实现）
        //3.db落库，发布事件
        CouponTemplateDO couponTemplateDO = new CouponTemplateDO();
        BeanUtil.copyProperties(requestParam, couponTemplateDO, "id");
        this.baseMapper.insert(couponTemplateDO);
        log.info("优惠券模板创建成功：{}", couponTemplateDO);
        applicationEventPublisher.publishEvent(new CouponTemplateEvent(couponTemplateDO.getId(), couponTemplateDO));
        //（1）刷新redis缓存，设置过期时间为优惠券到期时间
        //（2）发送消息队列，将更新时间作为版本号刷新c端本地缓存
    }

    @Override
    public IPage<CouponTemplateQueryRespDTO> pageQueryCouponTemplate(CouponTemplatePageQueryReqDTO requestParam) {
        LambdaQueryWrapper<CouponTemplateDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(StrUtil.isNotBlank(requestParam.getName()),CouponTemplateDO::getName,requestParam.getName())
                .like(StrUtil.isNotBlank(requestParam.getGoods()),CouponTemplateDO::getGoods,requestParam.getGoods())
                .eq(ObjectUtil.isNotNull(requestParam.getType()),CouponTemplateDO::getType,requestParam.getType())
                .eq(ObjectUtil.isNotNull(requestParam.getTarget()),CouponTemplateDO::getTarget,requestParam.getTarget());

        // 1. 创建分页对象（页码从1开始）
        Page<CouponTemplateDO> page = new Page<>(Optional.ofNullable(requestParam.getPageNo()).orElse(1)
                , Optional.ofNullable(requestParam.getPageSize()).orElse(10));

        // 2. 执行分页查询（需要注入CouponTemplateMapper）
        Page<CouponTemplateDO> resultPage = couponTemplateMapper.selectPage(page, wrapper);

        // 3. 转换DO到DTO
        return resultPage.convert(doObj -> BeanUtil.toBean(doObj,CouponTemplateQueryRespDTO.class));
    }

    @Override
    public CouponTemplateQueryRespDTO findCouponTemplateById(String couponTemplateId) {
        return null;
    }

    @Override
    public void terminateCouponTemplate(String couponTemplateId) {

    }

    @Override
    public void increaseNumberCouponTemplate(CouponTemplateNumberReqDTO requestParam) {

    }

    @Override
    public void decreaseNumberCouponTemplate(CouponTemplateNumberReqDTO requestParam) {
        Integer result = couponTemplateMapper.decreaseNumberCouponTemplate(requestParam.getCouponTemplateId(),requestParam.getNumber());
        if(!result.equals(1)){
            throw new ServiceException("优惠券库存不足，扣减失败");
        }
    }

    @Override
    public void updateCouponTemplate(CouponTemplateSaveReqDTO requestParam) {
        //1.责任链模式校验参数
        //2.分布式锁防止重复创建（controller注解实现）
        //3.db落库，发布事件
        CouponTemplateDO couponTemplateDO = new CouponTemplateDO();
        BeanUtil.copyProperties(requestParam, couponTemplateDO);
        this.baseMapper.updateById(couponTemplateDO);
        log.info("优惠券模板更新成功：{}", couponTemplateDO);
        applicationEventPublisher.publishEvent(new CouponTemplateEvent(couponTemplateDO.getId(), couponTemplateDO));
        //（1）刷新redis缓存，设置过期时间为优惠券到期时间
        //（2）发送消息队列，将更新时间作为版本号刷新c端本地缓存
    }
}
